/*
 // last revision 12:12 1/24 -Kevin Huynh
 //  mycalc.c
 //  EECS22 Lab
 //  Calculator
 //
 //  Created by Daniel Diaz and Kevin Huynh on 1/11/12.
 //  
 //  Copyright 2012 UCI. All rights reserved.
 */

#include <string.h>
#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    
	char *cp;
	double acc = 0;
	int ret = 0;
	char stringtmp1[20];
	char stringtmp2[20];
	char stringtmp3[20];
	char string1[100];
	char string2[100];
	char string3[100];
	double d;
	int y;
	long int x = 0;
	
	int counter = 0;
	int counter2 = 0;
	int counter3 = 0;
	double num1, num2;
	double num3;
    
	int testReg,testReg2, testReg3;
	int A=0,B=0,C=0;
	int D=0,E=0,F=0;
	int G=0,H=0,I=0;
	int J=0,K=0,L=0;
	int M=0,N=0,O=0;
	int P=0,Q=0,R=0;
	int S=0,T=0,U=0;
	int V=0,W=0,X=0;
	int Y=0,Z=0;
    
    FILE *fp;
    FILE *fz;
    
    char quitstring[] = "quitprogram";
    
    int registerarray[26] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    
    
    if ((fp = fopen("history.txt", "r")))
    {
        read_history ("history.txt");
        fclose(fp);
    }
    
    if ((fz = fopen("registerhistory.bin", "r"))) 
    {
        fread(registerarray, 8, 26,fz);
        fclose(fz);
        
        A = registerarray[0];
        B = registerarray[1];
        C = registerarray[2];
        D = registerarray[3];
        E = registerarray[4];
        F = registerarray[5];
        G = registerarray[6];
        H = registerarray[7];
        I = registerarray[8];
        J = registerarray[9];
        K = registerarray[10];
        L = registerarray[11];
        M = registerarray[12];
        N = registerarray[13];
        O = registerarray[14];
        P = registerarray[15];
        Q = registerarray[16];
        R = registerarray[17];
        S = registerarray[18];
        T = registerarray[19];
        U = registerarray[20];
        V = registerarray[21];
        W = registerarray[22];
        X = registerarray[23];
        Y = registerarray[24];
        Z = registerarray[25];

    }
    /*
    int asdfg;
    int asdf;
    double currentnum;
    FILE *fz;
    fz = fopen("registerhistory.txt", "r+");
     
    fseek(fz, 0, SEEK_END);
    if (ftell(fz) == 0)
    {
        for (asdf = 0; asdf <26; asdf++)
        {
            fprintf(fz,"%d",registerarray[asdf]);
            fclose(fz);
        }
    }
    fseek(fz, 0, SEEK_SET);
    */
    
    /*
    if (fz != 0)
    {
        for(asdfg = 0; asdfg <26; asdfg++)
        {
            fscanf(fz, "%lf ", &currentnum);
            registerarray[asdfg] = currentnum;
        
        }
    
        A = registerarray[0];
        B = registerarray[1];
        C = registerarray[2];
        D = registerarray[3];
        E = registerarray[4];
        F = registerarray[5];
        G = registerarray[6];
        H = registerarray[7];
        I = registerarray[8];
        J = registerarray[9];
        K = registerarray[10];
        L = registerarray[11];
        M = registerarray[12];
        N = registerarray[13];
        O = registerarray[14];
        P = registerarray[15];
        Q = registerarray[16];
        R = registerarray[17];
        S = registerarray[18];
        T = registerarray[19];
        U = registerarray[20];
        V = registerarray[21];
        W = registerarray[22];
        X = registerarray[23];
        Y = registerarray[24];
        Z = registerarray[25];
    
        fclose(fz);
    }
    */ 
    
    
	printf("%g: ", acc);
    
	while(1) 
	{
		cp = readline(" ");
        ret = sscanf(cp,"%s %s %s", &stringtmp1, &stringtmp2, &stringtmp3);
        
        add_history(stringtmp1);
        
		counter = 0;
		counter2 = 0;
        
        fp = fopen("history.txt", "w");
        write_history("history.txt");
        fclose(fp);
        
        if  (strcmp(quitstring, stringtmp1) == 0)
        {
            
            registerarray[0] = A;
            registerarray[1] = B;
            registerarray[2] = C;
            registerarray[3] = D;
            registerarray[4] = E;
            registerarray[5] = F;
            registerarray[6] = G;
            registerarray[7] = H;
            registerarray[8] = I;
            registerarray[9] = J;
            registerarray[10] = K;
            registerarray[11] = L;
            registerarray[12] = M;
            registerarray[13] = N;
            registerarray[14] = O;
            registerarray[15] = P;
            registerarray[16] = Q;
            registerarray[17]= R;
            registerarray[18] = S;
            registerarray[19] = T;
            registerarray[20] = U;
            registerarray[21] = V;
            registerarray[22] = W;
            registerarray[23] = X;
            registerarray[24] = Y;
            registerarray[25] = Z;
            
            
            fp = fopen("registerhistory.bin", "w");
            fwrite (registerarray , 8 , 26 , fp);
            fclose(fp);
            
            /*
            int x;
            FILE *fz;
            fz = fopen("registerhistory.txt", "w");
             */
            
            /*save registers to txt file*/
            /*
            registerarray[0] = A;
            registerarray[1] = B;
            registerarray[2] = C;
            registerarray[3] = D;
            registerarray[4] = E;
            registerarray[5] = F;
            registerarray[6] = G;
            registerarray[7] = H;
            registerarray[8] = I;
            registerarray[9] = J;
            registerarray[10] = K;
            registerarray[11] = L;
            registerarray[12] = M;
            registerarray[13] = N;
            registerarray[14] = O;
            registerarray[15] = P;
            registerarray[16] = Q;
            registerarray[17]= R;
            registerarray[18] = S;
            registerarray[19] = T;
            registerarray[20] = U;
            registerarray[21] = V;
            registerarray[22] = W;
            registerarray[23] = X;
            registerarray[24] = Y;
            registerarray[25] = Z;
            */
            
            /*
            for (x = 0; x <26; x++)
            {
                fprintf(fz,"%d",registerarray[x]);
                
            }
            
            fclose(fz);
             */
            
            
            break;
        }
        

        
        
		while(stringtmp1[counter] != '\0')
        {
			testReg = stringtmp1[0];
            if (stringtmp1[0] == '+' && stringtmp1[1] != '\0')
            {
                x = strlen(stringtmp1);
                for (y = 1; y <= x; y++)
                {   
                    string1[y-1] = stringtmp1[y];
                    d = atoi(string1);
                }
                num1 = d;
            }
            
			if (stringtmp1[0] == '.' && stringtmp1[1] != '\0')
            {
                x = strlen(stringtmp1);
                for (y = 1; y <= x; y++)
                {
                    string1[y-1] = stringtmp1[y-1];
                    d = atof(string1);
                }
                num1 = d;
            }
            
            
            if (stringtmp1[0] == '-' && stringtmp1[1] != '\0')
            {
                x = strlen(stringtmp1);
                for (y = 1; y <= x; y++)
                {    
                    string1[y-1] = stringtmp1[y];
                    d = atoi(string1);    
                }
                num1 = -d;
            }
            
			if ((stringtmp1[0] == '0' || stringtmp1[0] == '1' ||stringtmp1[0] ==  
                 '2' || stringtmp1[0] == '3' ||stringtmp1[0] == '4' ||stringtmp1[0] == '5' ||stringtmp1[0] == '6' 
                 ||stringtmp1[0] == '7' ||stringtmp1[0] == '8' ||stringtmp1[0] == '9') && stringtmp1[1] != '\0')
            {
                x = strlen(stringtmp1);
                for (y = 0; y <= x; y++)
                {
                    
                    string1[y] = stringtmp1[y];
                    num1 = atof(string1);
                    
                }
                
            }	
            
			if ((stringtmp1[0] == '0' || stringtmp1[0] == '1' ||stringtmp1[0] ==  '2' || stringtmp1[0] == '3' ||stringtmp1[0] == '4' ||stringtmp1[0] == '5' || stringtmp1[0] == '6' 
                 ||stringtmp1[0] == '7' ||stringtmp1[0] == '8' ||stringtmp1[0] == '9') && stringtmp1[1] == '\0')
            {
                num1 = atoi(stringtmp1);
                
            }
            
            if (stringtmp1[0] == '+' && stringtmp1[1] == '\0')
            {
				num1 = abs(num1);
            }
            
            if (stringtmp1[0] == '-' && stringtmp1[1] == '\0')
            {
				num1 = -1;
            }
            
			if (testReg > 63 && testReg < 123)
			{
				if(testReg == 65 || testReg == 97)
				{
					num1 = A;
				}
                
                if(testReg == 66 || testReg == 98)
                { 
                    num1= B;
                }
                if(testReg == 67 || testReg == 99)
                { 
                    num1 = C;
                }
                if(testReg == 68 || testReg == 100)
                { 
                    num1 = D;
                }
                if(testReg == 69 || testReg == 101)
                { 
                    num1 = E;
                }
                if(testReg == 70 || testReg == 102)
                { 
                    num1 = F;
                }
                if(testReg == 71 || testReg == 103)
                { 
                    num1 = G;
                }
                if(testReg == 72 || testReg == 104)
                { 
                    num1 = H;
                }
                if(testReg == 73 || testReg == 105)
                { 
                    num1 = I;
                }
                if(testReg == 74 || testReg == 106)
                { 
                    num1 = J;
                }
                if(testReg == 75 || testReg == 107)
                { 
                    num1 = K;
                }
                if(testReg == 76 || testReg == 108)
                { 
                    num1 = L;
                }
                if(testReg == 77 || testReg == 109)
                { 
                    num1 = M;
                }
                if(testReg == 78 || testReg == 110)
                { 
                    num1= N;
                }
                if(testReg == 79 || testReg == 111)
                { 
                    num1 = O;
                }
                if(testReg == 80 || testReg == 112)
                { 
                    num1 = P;
                }
                if(testReg == 81 || testReg == 113)
                { 
                    num1 = Q;
                }
                if(testReg == 82 || testReg == 114)
                { 
                    num1 = R;
                }
                if(testReg == 83 || testReg == 115)
                { 
                    num1 = S;
                }
                if(testReg == 84 || testReg == 116)
                { 
                    num1 = T;
                }
                if(testReg == 85 || testReg == 117)
                { 
                    num1 = U;
                }
                if(testReg == 86 || testReg == 118)
                { 
                    num1 = V;
                }
                if(testReg == 87 || testReg == 119)
                { 
                    num1 = W;
                }
                if(testReg == 88 || testReg == 120)
                { 
                    num1 = X;
                }
                if(testReg == 89 || testReg == 121)
                { 
                    num1 = Y;
                }
                if(testReg == 90 || testReg == 122)
                { 
                    num1 = Z;
                }
                
			}
            
            if (stringtmp1[0] == '@' && stringtmp1[1] != '\0')
            {
                printf("Invalid format. Please provide spaces between @ and the register.");
            }
            counter++;          
        }
        
		while(stringtmp2[counter2] != '\0')
        {
            
			testReg2 = (int)stringtmp2[0];
            if (stringtmp2[0] == '+' && stringtmp2[1] != '\0')
            {
                x = strlen(stringtmp2);
                for (y = 1; y <= x; y++)
                {
                    string2[y-1] = stringtmp2[y];
                    d = atoi(string2);
                }
                num2 = d;
            }
            
			if (stringtmp2[0] == '.' && stringtmp2[1] != '\0')
            {   
                x = strlen(stringtmp2);
                for (y = 1; y <= x; y++)
                {
                    string2[y-1] = stringtmp2[y-1];
                    d = atof(string2);
                }
                num2 = d;
            }
            
            
            if (stringtmp2[0] == '-' && stringtmp2[1] != '\0')
            {
                x = strlen(stringtmp2);
                for (y = 1; y <= x; y++)
                {
                    string2[y-1] = stringtmp2[y];
                    d = atoi(string2);
                }
                num2 = -d;
            }
            
            if ((stringtmp2[0] == '0' || stringtmp2[0] == '1' ||stringtmp2[0] ==  
                 '2' || stringtmp2[0] == '3' ||stringtmp2[0] == '4' ||stringtmp2[0] == '5' ||stringtmp2[0] == '6'
                 ||stringtmp2[0] == '7' ||stringtmp2[0] == '8' ||stringtmp2[0] == '9') && stringtmp2[1] != 
                '\0')
            {
                x = strlen(stringtmp2);
                for (y = 0; y <= x; y++)
				{
                    
                    string2[y] = stringtmp2[y];
                    num2 = atoi(string2);
                    
                }
                
            }
            
            if ((stringtmp2[0] == '0' || stringtmp2[0] == '1' ||stringtmp2[0] ==  '2' || stringtmp2[0] == 
                 '3' ||stringtmp2[0] == '4' ||stringtmp2[0] == '5' ||stringtmp2[0] == '6'
                 ||stringtmp2[0] == '7' ||stringtmp2[0] == '8' ||stringtmp2[0] == '9') && stringtmp2[1] == 
                '\0')
            {
                num2 = atoi(stringtmp2);
                
            }
            
            
            if (stringtmp2[0] == '+' && stringtmp2[1] == '\0')
            {
                num2 = abs(num2);
            }
            
            if (stringtmp2[0] == '-' && stringtmp2[1] == '\0')
            {
                num2 = -1 *num2;
            }
            counter2++;
            
			if(testReg2 > 63 && testReg2 < 123)
			{ 
				if(testReg2 == 65 || testReg2 == 97)
                {
                    num2 = A;
                }
                
                if(testReg2 == 66 || testReg2 == 98) 
                {
                    num2 = B; 
                }
                if(testReg2 == 67 || testReg2 == 99) 
                {
                    num2 = C;
                }
                if(testReg2 == 68 || testReg2 == 100)
                {
                    num2 = D;
                }
                if(testReg2 == 69 || testReg2 == 101)
                {
                    num2 = E;
                }
                if(testReg2 == 70 || testReg2 == 102)
                {
                    num2 = F;
                }
                if(testReg2 == 71 || testReg2 == 103)
                {
                    num2 = G;
                }
                if(testReg2 == 72 || testReg2 == 104)
                {
                    num2 = H;
                }
                if(testReg2 == 73 || testReg2 == 105)
                {
                    num2 = I;
                }
				if(testReg2 == 74 || testReg2 == 106)
                {
                    num2 = J;
                }
                if(testReg2 == 75 || testReg2 == 107)
                {
                    num2 = K;
                }
                if(testReg2 == 76 || testReg2 == 108)
                {
                    num2 = L;
                }
                if(testReg2 == 77 || testReg2 == 109)
                {
                    num2 = M;
                }
                if(testReg2 == 78 || testReg2 == 110)
                {
                    num1= N; 
                }
                if(testReg2 == 79 || testReg2 == 111)
                {
                    num2 = O;
                }
                if(testReg2 == 80 || testReg2 == 112)
                {
                    num2 = P;
                }
				if(testReg2 == 81 || testReg2 == 113)
                {
                    num2 = Q;
                }
                if(testReg2 == 82 || testReg2 == 114)
                {
                    num2 = R;
                }
                if(testReg2 == 83 || testReg2 == 115)
                {
                    num2 = S;
                }
                if(testReg2 == 84 || testReg2 == 116)
                {
                    num2 = T;
                }
                if(testReg2 == 85 || testReg2 == 117)
                {
                    num2 = U;
                }
                if(testReg2 == 86 || testReg2 == 118)
                {
                    num2 = V;
                }
                if(testReg2 == 87 || testReg2 == 119)
                {
                    num2 = W;
                }
				if(testReg2 == 88 || testReg2 == 120)
                {
                    num2 = X;
                }
                if(testReg2 == 89 || testReg2 == 121)
                {
                    num2 = Y;
                }
                if(testReg2 == 90 || testReg2 == 122)
                {
                    num2 = Z;
                }
			}
            
            
            
        }
        
        
        
        
        
        
        while(stringtmp3[counter3] != '\0')
        {
			testReg3 = (int)stringtmp3[0];
            if (stringtmp3[0] == '+' && stringtmp3[1] != '\0')
            {
                x = strlen(stringtmp3);
                for (y = 1; y <= x; y++)
                {
                    string3[y-1] = stringtmp3[y];
                    d = atoi(string3);
                }
                num3 = d;
            }
            
            if (stringtmp3[0] == '-' && stringtmp3[1] != '\0')
            {
                x = strlen(stringtmp3);
                for (y = 1; y <= x; y++)
                {
                    string3[y-1] = stringtmp3[y];
                    d = atoi(string3);
                }
                num3 = -d;
            }
            
            if ((stringtmp3[0] == '0' || stringtmp3[0] == '1' ||stringtmp3[0] ==  
                 '2' || stringtmp3[0] == '3' ||stringtmp3[0] == '4' ||stringtmp3[0] == '5' ||stringtmp3[0] == '6'
                 ||stringtmp3[0] == '7' ||stringtmp3[0] == '8' ||stringtmp3[0] == '9') && stringtmp3[1] != 
                '\0')
            {
                x = strlen(stringtmp3);
                for (y = 0; y <= x; y++)
                {
                    
                    string3[y] = stringtmp3[y];
                    num3 = atoi(string3);
                    
                }
                
            }
            
            
            if ((stringtmp3[0] == '0' || stringtmp3[0] == '1' ||stringtmp3[0] ==  '2' || stringtmp3[0] == 
                 '3' ||stringtmp3[0] == '4' ||stringtmp3[0] == '5' ||stringtmp3[0] == '6'
                 ||stringtmp3[0] == '7' ||stringtmp3[0] == '8' ||stringtmp3[0] == '9') && stringtmp3[1] == 
                '\0')
            {
                num3 = atoi(stringtmp3);
                
            }
            
            
            if (stringtmp3[0] == '+' && stringtmp3[1] == '\0')
            {
                num3 = abs(num3);
            }
            
            if (stringtmp3[0] == '-' && stringtmp3[1] == '\0')
            {
                num3 = -1 *num3;
            }
            counter3++;
            
        }
        
        
        
		if(ret == 1)
		{
			if(stringtmp1[0] == '+')
			{
				acc = acc * num1;
			}
			if(stringtmp1[0] == '-')
			{
				acc = acc * num1;
			}
			if(stringtmp1[0] != '+' && stringtmp1[0] != '-')
			{
				acc = num1;
			}
			if(testReg>63 && testReg <123)
			{
				acc = num1;
			}
			
		}
		
		if(ret == 2)
		{
			if(stringtmp1[0] == '+' && (testReg2 < 64 || testReg2 > 123))
			{
				acc = acc + num2;
			}
			if(stringtmp1[0] == '-' && (testReg2 < 64 || testReg2 > 123))
			{
				acc = acc - num2;
			}
			if(stringtmp1[0] == '*' && (testReg2 < 64 || testReg2 > 123))
			{
				acc = acc * num2;
			}
			if(stringtmp1[0] == '/' && (testReg2 < 64 || testReg2 > 123))
			{
				acc = acc / num2;
			}
			if(testReg == 64)
			{
				if(testReg2 == 65 || testReg2 == 97)
				{
					A = acc;
				}
                if(testReg2 == 66 || testReg2 == 98) 
                {
                    B = acc;
                }
                if(testReg2 == 67 || testReg2 == 99) 
                {
                    C = acc;
                }
                if(testReg2 == 68 || testReg2 == 100)
                {
                    D = acc;
                }
                if(testReg2 == 69 || testReg2 == 101)
                {
                    E = acc;
                }
                if(testReg2 == 70 || testReg2 == 102)
                {       
                    F = acc;
                }
                if(testReg2 == 71 || testReg2 == 103)
                {
                    G = acc;
                }
                if(testReg2 == 72 || testReg2 == 104)
                {
                    H = acc;
                }
                if(testReg2 == 73 || testReg2 == 105)
                {
                    I = acc;
                }
                if(testReg2 == 74 || testReg2 == 106)
                {
                    J = acc;
                }
                if(testReg2 == 75 || testReg2 == 107)
                {
                    K = acc;
                }
                if(testReg2 == 76 || testReg2 == 108)
                {
                    L = acc;
                }
                if(testReg2 == 77 || testReg2 == 109)
                {
                    M = acc;
                }
                if(testReg2 == 78 || testReg2 == 110)
                {
                    N = acc; 
                }
                if(testReg2 == 79 || testReg2 == 111)
                {
                    O = acc;
                }
                if(testReg2 == 80 || testReg2 == 112)
                {
                    P = acc;
                }
                if(testReg2 == 81 || testReg2 == 113)
                {
                    Q = acc;
                }
                if(testReg2 == 82 || testReg2 == 114)
                {
                    R = acc;
                }
                if(testReg2 == 83 || testReg2 == 115)
                {
                    S = acc;
                }
                if(testReg2 == 84 || testReg2 == 116)
                {
                    T = acc;
                }
                if(testReg2 == 85 || testReg2 == 117)
                {
                    U = acc;
                }
                if(testReg2 == 86 || testReg2 == 118)
                {
                    V = acc;
                }
                if(testReg2 == 87 || testReg2 == 119)
                {
                    W = acc;
                }
				if(testReg2 == 88 || testReg2 == 120)
                {       
                    X = acc;
                }
                if(testReg2 == 89 || testReg2 == 121)
                {
                    Y = acc;
                }
                if(testReg2 == 90 || testReg2 == 122)
                {
                    Z = acc;
                }
            }
            
			if(testReg2 > 64 && testReg2 < 123)
			{
				if(stringtmp1[0] == '+')
				{
					acc = acc + num2;
				}
				if(stringtmp1[0] == '-')
				{
					acc = acc - num2;
				}
				if(stringtmp1[0] == '*')
				{
					acc = acc * num2;
				}
				if(stringtmp1[0] == '/')
				{
					acc = acc / num2;
				}
			}
		}
        
		if(ret == 3)
        {	
            if(stringtmp2[0] == '+')
            {
                acc = num1 + num3;
            }
            if(stringtmp2[0] == '-')
            {
                acc = num1 - num3;
            }
            if(stringtmp2[0] == '*')
            {
                acc = num1 * num3;
            }
            if(stringtmp2[0] == '/')
            {
                acc = num1 / num3;
            }
			if(testReg > 64 && testReg < 122)
			{
				if(testReg == 65 || testReg == 97)
                {
                    A = num3;
                }
                
                if(testReg == 66 || testReg == 98)
                {
                    B = num3;
                }
                if(testReg == 67 || testReg == 99)
                {
                    C = num3;
                }
                
                if(testReg == 68 || testReg == 100)
                {
                    D = num3;
                }
                if(testReg == 69 || testReg == 101)
                {
                    E = num3;
                }
                if(testReg == 70 || testReg == 102)
                {
                    F = num3;
                }
                if(testReg == 71 || testReg == 103)
                {
                    G = num3;
                }
                if(testReg == 72 || testReg == 104)
                {
                    H = num3;
                }
                if(testReg == 73 || testReg == 105)
                {
                    I = num3;
                }
                if(testReg == 74 || testReg == 106)
                {
                    J = num3;
                }
                if(testReg == 75 || testReg == 107)
                {
                    K = num3;
                }
                if(testReg == 76 || testReg == 108)
                {
                    L = num3;
                }
                if(testReg == 77 || testReg == 109)
                {
                    M = num3;
                }
                if(testReg == 78 || testReg == 110)
                {
                    N = num3;
                }
                if(testReg == 79 || testReg == 111)
                {
                    O = num3;
                }
                if(testReg == 80 || testReg == 112)
                {
                    P = num3;
                }
                if(testReg == 81 || testReg == 113)
                {
                    Q = num3;
                }
                
                if(testReg == 82 || testReg == 114)
                {
                    R = num3;
                }
                if(testReg == 83 || testReg == 115)
                {
                    S = num3;
                }
                if(testReg == 84 || testReg == 116)
                {
                    T = num3;
                }
                if(testReg == 85 || testReg == 117)
                {
                    U = num3;
                }
                if(testReg == 86 || testReg == 118)
                {
                    V = num3;
                }
                if(testReg == 87 || testReg == 119)
                {
                    W = num3;
                }
                if(testReg == 88 || testReg == 120)
                {
                    X = num3;
                }
                if(testReg == 89 || testReg == 121)
                {
                    Y = num3;
                }
                if(testReg == 90 || testReg == 122)
                {
                    Z = num3;
                }
			}
            
            
        }
        
		
        printf("%g: ", acc);
        counter = 0;
        counter2 = 0;
        counter3 = 0;
        num1 = 0;
        num2 = 0;
        num3 = 0;
	}
    
    return 0;
}